/**
 * @description 反转单向链表
 * @author 李子一
 */

export interface ILinkListNode {
	value: number
	next?: ILinkListNode
}

/**
 * @description 反转单向链表,并返回反转之后的 head node
 * @param listNode list node
 */
export function reverseLinkList(listNode: ILinkListNode): ILinkListNode {
	let prevNode: ILinkListNode | undefined = undefined,
		curNode: ILinkListNode | undefined = undefined,
		nextNode: ILinkListNode | undefined = listNode

	// 以 nextNode 遍历链表
	while (nextNode) {
		if (curNode && !prevNode) {
			curNode.next = undefined
		}

		// 改变链表中每个节点的 next 指向
		if (curNode && prevNode) {
			curNode.next = prevNode
		}

		// 遍历链表
		prevNode = curNode
		curNode = nextNode
		nextNode = nextNode.next
	}

	curNode!.next = prevNode

	return curNode!
}

/**
 * @description 根据数组创建链表
 * @param arr
 */
export function createLinkList(arr: number[]): ILinkListNode {
	const length = arr.length
	if (!length) {
		throw new Error('arr is empty')
	}

	let curNode: ILinkListNode = { value: arr[length - 1] }
	if (length === 1) {
		return curNode
	} else {
		for (let i = length - 2; i >= 0; i--) {
			curNode = {
				value: arr[i],
				next: curNode
			}
		}
	}

	return curNode
}

// const arr = [1, 2, 3, 4, 5]
// const list = createLinkList(arr)
// console.log(JSON.stringify(list, null, '	'))
// console.log(list)
